// 进行 axios 实例的创建
import axios from 'axios'
import Vue from 'vue'
// 导入路由文件, 为了得到 router 这个路由遥控器
import router from '@/router'
// 导入 ElememtUI 内的 message 模块
import { Message } from 'element-ui'

// 1. 创建实例
const instance = axios.create({
  baseURL: 'http://localhost:8888/api/private/v1/',
  headers: {}
})

// 2. 请求拦截器
instance.interceptors.request.use(config => {
  // 表示你在发送登录请求, 那么直接放行
  // url 就是你在书写 this.$get() 或者 this.$port() 的时候, 传递的第一个参数
  if (config.url === 'login') return config

  // 只要不是登录请求, 都需要进行 token 的添加
  // 获取到 token 添加在 headers 内部
  config.headers.authorization = window.sessionStorage.getItem('token')

  return config
})

// 3. 响应拦截器
instance.interceptors.response.use(config => {
  // 判断一下返回的内容中, 如果 status 是 401 表示 token 出问题了
  // 可能是被人攻击以后, 伪造的
  // 我们就直接跳转回到登录页面, 进行从新登录的操作
  if (config.data.meta.status === 401) {
    // 直接跳转回到 /login 路由就行了
    Message({
      type: 'error',
      message: '登录状态失效, 请重新登录',
      duration: 3000
    })
    router.push('/login')
    return config.data
  }

  return config.data
})

// 4. 创建一个对象
const plugin = {
  install () {
    Vue.prototype.$http = instance
    Vue.prototype.$get = instance.get
    Vue.prototype.$post = instance.post
    Vue.prototype.$put = instance.put
    Vue.prototype.$delete = instance.delete
  }
}

// 5. 导出 plugin
export default plugin
